home *** CD-ROM | disk | FTP | other *** search
- /* $RCSfile: undoLHash.C,v $
- * $Revision: 1.1.1.1 $
- * $Date :$
- */
- /**********************************************************************
- * EXODUS Database Toolkit Software
- * Copyright (c) 1991 Computer Sciences Department, University of
- * Wisconsin -- Madison
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * THE COMPUTER SCIENCES DEPARTMENT OF THE UNIVERSITY OF WISCONSIN --
- * MADISON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.
- * THE DEPARTMENT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
- * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * The EXODUS Project Group requests users of this software to return
- * any improvements or extensions that they make to:
- *
- * EXODUS Project Group
- * c/o David J. DeWitt and Michael J. Carey
- * Computer Sciences Department
- * University of Wisconsin -- Madison
- * Madison, WI 53706
- *
- * or exodus@cs.wisc.edu
- *
- * In addition, the EXODUS Project Group requests that users grant the
- * Computer Sciences Department rights to redistribute these changes.
- **********************************************************************/
- #include "BTREEPAGE.h"
- #include "LHDIRPAGE.h"
- #include "BT_Tuple.h"
- #include "LH_Log.h"
- #ifdef INIT_LRC_IS_LSN
- # include "log_globals.h"
- #endif
-
- extern void (*LH_PrintFunc)(int len, char* key);
-
- #ifdef DEBUG_LHASH
- static void IntPrint(int /* kLen */, char* key)
- {
- printf("%d", *((int*) key));
- }
- #endif
-
-
- void undoLHash(LOGRECORDHDR* recHdr)
- {
- undoLHash_fr(recHdr);
- }
-
- void undoLHash_fr(LOGRECORDHDR* recHdr)
- {
- #ifdef INIT_LRC_IS_LSN
- LRC tempLRC;
- LRC *lrc = &tempLRC;
- #else
- LRC *lrc;
- #endif /* INIT_LRC_IS_LSN; */
-
- TRPRINT(TR_IO, TR_LEVEL_1, ("lsn:%d", recHdr->recordLSN));
-
- TRANSREC* transRec = (TRANSREC*) Active->transRec;
- INIT_MISSING_UPDATE_INFO( transRec );
-
- PID* pid = &recHdr->actionPid;
- TRPRINT(TR_IO|TR_LOG, TR_LEVEL_2, ("pid:%d", pid->page));
-
- GROUPLINK* groupLink = bf_ReadPage(UserBufGroup, pid,
- BTREE_PAGE2SIZE, BF_SEM);
-
- LHINDPAGE* indp = (LHINDPAGE*) groupLink->bufFrame;
- BOOL actionDone = compareLRC( &recHdr->actionLRC, &(indp->lrc())) <= 0;
-
- #ifndef INIT_LRC_IS_LSN
- SM_ASSERT(LEVEL_3, missingUpdateInfo != NULL);
- #endif
-
- RECORD_MISSING_UPDATE(actionDone, &lrc, missingUpdateInfo, pid,
- & indp->lrc(), groupLink->pageHash, recHdr,
- PAGE_INDEX);
-
- if (lrc != & indp->lrc()) GENERATE_LRC(lrc);
-
- LSNOFFSET undoNextLSN = recHdr->previousLSN;
-
- signalSemaphore( & groupLink->pageHash->semaphore);
-
- void* vptr = GET_LOG_IMAGE(recHdr, 0);
- LH_TRACE(("U(%d,%d,%c): ", recHdr->recordLSN.offset, pid->page,
- actionDone ? 't' : 'f'));
- PAGEHASH* pHash = actionDone ? groupLink->pageHash : 0;
-
- switch (recHdr->action) {
- int i;
-
- case LOG_ACTION_LHASH_PHYSIC_INSERT:
- {
- LogLhashPhysicInsertData* rp = (LogLhashPhysicInsertData*) vptr;
- ASSERT3(rp->startSlot >= 0 && rp->numSlots > 0);
- LH_TRACE(("undo physic insert\n"));
-
- if (actionDone) {
- for (i = rp->startSlot + rp->numSlots - 1;
- i >= rp->startSlot; i--) {
- indp->RemoveTuple(i);
- }
- }
- LH_LogPhysicDelete(indp->SelfID(), pHash, *lrc,
- rp->startSlot, rp->numSlots,
- (int)rp->length, rp->data);
- }
- break;
- case LOG_ACTION_LHASH_PHYLOG_INSERT:
- {
- LogLhashPhyLogInsertData* rp = (LogLhashPhyLogInsertData*) vptr;
- ASSERT3(rp->numSlots > 0);
- LH_TRACE((" undo physiologic insert\n"));
- TWO slot;
- PFC func = SMCOMPFUNC[indp->KeyType()];
- if (actionDone) {
- char* buff = rp->data;
- for (i = rp->numSlots - 1;
- i >= 0; i--) {
- BT_Tuple* tp = (BT_Tuple*) buff;
- if (!indp->Search(tp->KeyLen(), tp->KeyValue(), func,slot)) {
- ASSERT3(FALSE);
- }
- else {
- indp->RemoveTuple(slot);
- }
- buff += tp->Size();
- }
- }
- LH_LogPhyLogDelete(indp->SelfID(), pHash, *lrc, rp->numSlots,
- (int)rp->length, rp->data);
- }
- break;
- case LOG_ACTION_LHASH_PHYSIC_DELETE:
- {
- LogLhashPhysicDeleteData* rp = (LogLhashPhysicDeleteData*) vptr;
- ASSERT3(rp->startSlot >= 0 && rp->numSlots > 0);
- LH_TRACE((" undo physic delete\n"));
- if (actionDone) {
- char* buff = rp->data;
- for (i = rp->startSlot; i < rp->startSlot+rp->numSlots; i++) {
- BT_Tuple* tp = (BT_Tuple*) buff;
- indp->InsertTuple(*tp, i);
- buff += tp->Size();
- }
- ASSERT3(buff - rp->data <= rp->length);
- }
- LH_LogPhysicInsert(indp->SelfID(), pHash, *lrc,
- rp->startSlot, rp->numSlots,
- (int)rp->length, rp->data);
- }
- break;
- case LOG_ACTION_LHASH_PHYLOG_DELETE:
- {
- LogLhashPhyLogDeleteData* rp = (LogLhashPhyLogDeleteData*) vptr;
- ASSERT3(rp->numSlots > 0);
- LH_TRACE((" undo physiologic delete\n"));
- TWO slot;
- PFC func = SMCOMPFUNC[indp->KeyType()];
- if (actionDone) {
- char* buff = rp->data;
- for (i = 0; i < rp->numSlots; i++) {
- BT_Tuple* tp = (BT_Tuple*) buff;
- if (indp->Search(tp->KeyLen(), tp->KeyValue(), func,slot)) {
- ASSERT3(FALSE);
- }
- else {
- indp->InsertTuple(*tp, slot);
- }
- buff += tp->Size();
- }
- }
- LH_LogPhyLogInsert(indp->SelfID(), pHash, *lrc, rp->numSlots,
- (int)rp->length, rp->data);
- }
- break;
-
- case LOG_ACTION_LHASH_LOGIC_INSERT:
- {
- LogLhashLogicInsertData* rp = (LogLhashLogicInsertData*) vptr;
- LH_TRACE((" undo logic insert %d\n", * (int*) rp->Key()));
- if (actionDone) {
- if (lh_RemoveEntry(transRec->tid, rp->rootPid, UserBufGroup,
- rp->Key(), rp->keyLen, rp->elSize,
- rp->El(), rp->maxKeyLen, rp->unique,
- SMCOMPFUNC[rp->keyType], !rp->primary)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- LH_LogLogicDelete(indp->SelfID(), pHash, *lrc,
- rp->rootPid, rp->Key(), rp->keyLen,
- rp->El(), rp->elSize, rp->maxKeyLen,
- rp->unique, rp->keyType, rp->primary);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
-
- case LOG_ACTION_LHASH_LOGIC_DELETE:
- {
- LogLhashLogicDeleteData* rp = (LogLhashLogicDeleteData*) vptr;
- LH_TRACE((" undo logic delete %d\n", * (int*) rp->Key()));
- if (actionDone) {
- if (lh_InsertEntry(transRec->tid, rp->rootPid, UserBufGroup,
- rp->Key(), rp->keyLen, rp->elSize,
- rp->El(), rp->maxKeyLen, rp->unique,
- SMCOMPFUNC[rp->keyType], !rp->primary)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- LH_LogLogicInsert(indp->SelfID(), pHash, *lrc,
- rp->rootPid, rp->Key(), rp->keyLen,
- rp->El(), rp->elSize, rp->maxKeyLen,
- rp->unique, rp->keyType, rp->primary);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
- case LOG_ACTION_LHASH_SET_INDEX_OVERFLOW:
- {
- LogSetIndexOverflowData* rp = (LogSetIndexOverflowData*) vptr;
- BOOL keepFlag = (rp->oldOvPage != NULLPID);
- if (actionDone) {
- indp->SetPageOverflow(rp->oldOvPage);
- indp->ResetPageOverflow(keepFlag);
- }
- LH_LogResetIndexOverflow(indp->SelfID(), pHash, *lrc,
- rp->oldOvPage, keepFlag);
- }
- break;
- case LOG_ACTION_LHASH_RESET_INDEX_OVERFLOW:
- {
- LogResetIndexOverflowData* rp = (LogResetIndexOverflowData*) vptr;
- SHORTPID newOvPage = indp->OvPage();
-
- if (actionDone) {
- indp->SetPageOverflow(rp->oldOvPage);
- }
- LH_LogSetIndexOverflow(indp->SelfID(), pHash, *lrc,
- rp->oldOvPage, newOvPage);
- }
- break;
- case LOG_ACTION_LHASH_DIR_UPDATE:
- {
- LHDIRPAGE* dirp = (LHDIRPAGE*) groupLink->bufFrame;
- LogDirUpdateData* rp = (LogDirUpdateData*) vptr;
- if (actionDone) {
- if (rp->growFlag)
- dirp->IndShrinkUpdate(rp->fromLoad, rp->toLoad,
- rp->oldFromLoad);
- else
- dirp->IndSplitUpdate(rp->oldFromLoad, rp->fromLoad,
- rp->toLoad);
- }
- LH_LogDirUpdate(dirp->SelfID(), pHash, *lrc, rp->oldFromLoad,
- rp->fromLoad, rp->toLoad, !rp->growFlag);
- }
- break;
- case LOG_ACTION_LHASH_DIR_SPLIT_RESET:
- {
- LHDIRPAGE* dirp = (LHDIRPAGE*) groupLink->bufFrame;
- LogDirSplitData* rp = (LogDirSplitData*) vptr;
- if (actionDone) {
- dirp->lhDirCtrl.height = (ONE) rp->height;
- dirp->lhDirCtrl.curPos = rp->curPos;
- BCOPY(rp->data, dirp->indPid,
- (int)rp->curPos*sizeof(SHORTPID));
- }
- LH_LogDirSplitCopy(dirp->SelfID(), pHash, *lrc,
- (int) rp->height, (int) rp->curPos);
- }
- break;
- case LOG_ACTION_LHASH_DIR_LOAD_UPDATE:
- {
- LHDIRPAGE* dirp = (LHDIRPAGE*) groupLink->bufFrame;
- LogDirLoadUpdateData* rp = (LogDirLoadUpdateData*) vptr;
- if (actionDone) {
- dirp->LoadUpdate(rp->load2,rp->load1);
- }
- LH_LogDirLoadUpdate(dirp->SelfID(), pHash, *lrc,
- rp->load2, rp->load1);
- }
- break;
- case LOG_ACTION_LHASH_DIR_SET_NEXT_ENTRY:
- {
- LHDIRPAGE* dirp = (LHDIRPAGE*) groupLink->bufFrame;
- LogDirSetNextEntryData* rp = (LogDirSetNextEntryData*) vptr;
- LH_TRACE(("undo root set next entry, hashval %d\n", rp->hashVal));
- if (actionDone) {
- dirp->UnSetNextEntry(rp->hashVal);
- }
- LH_LogDirSetNextEntry(dirp->SelfID(), pHash, *lrc, NULLPID-1, rp->hashVal);
- }
- break;
- case LOG_ACTION_LHASH_SET_THRESHOLD:
- {
- LHDIRPAGE* dirp = (LHDIRPAGE*) groupLink->bufFrame;
- LogSetThresholdData* rp = (LogSetThresholdData*) vptr;
- if (actionDone) {
- dirp->SetThreshold(rp->oldThreshold);
- }
- LH_LogSetThreshold(dirp->SelfID(), pHash, *lrc,
- rp->newThreshold, rp->oldThreshold);
- }
- break;
- case LOG_ACTION_LHASH_DIR_ROOT_CTRL:
- {
- LHDIRPAGE* dirp = (LHDIRPAGE*) groupLink->bufFrame;
- LogDirRootCtrlData* rp = (LogDirRootCtrlData*) vptr;
- PRINT_PROGRESS(("undo root ctrl: pid %d\n", dirp->SelfID().page));
- if (actionDone) {
- dirp->lhDirCtrl.M = rp->M;
- dirp->lhDirCtrl.P = rp->P;
- dirp->lhDirCtrl.I = rp->I;
- dirp->lhDirCtrl.curPos = rp->curPos;
- dirp->lhDirCtrl.height = rp->height;
- dirp->lhDirCtrl.load = rp->load;
- for (i=0;i<INIT_PRIMARY;i++)
- dirp->SetEntry(NULLPID,i);
- }
- LH_LogDirRootCtrl(dirp->SelfID(), pHash, *lrc, FALSE);
- for (i=0;i<INIT_PRIMARY;i++)
- LH_LogDirSetNextEntry(dirp->SelfID(), pHash, *lrc,
- NULLPID, i);
- }
- break;
- case LOG_ACTION_LHASH_LOGIC_INCR_OIDCNT:
- {
- LogLhashLogicIncrElCntData* rp =
- (LogLhashLogicIncrElCntData*) vptr;
- LH_TRACE(("undo ++elemcnt\n"));
-
- if (actionDone) {
- if (LH_DecrElCnt(transRec->tid, rp->rootPid, UserBufGroup,
- rp->key, rp->keyLen, rp->maxKeyLen,
- SMCOMPFUNC[rp->keyType])){
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- LH_LogLogicDecrElCnt(indp->SelfID(), pHash, *lrc,
- rp->rootPid,
- rp->key, rp->keyLen, rp->maxKeyLen,
- rp->keyType);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
- case LOG_ACTION_LHASH_LOGIC_DECR_OIDCNT:
- {
- LogLhashLogicDecrElCntData* rp =
- (LogLhashLogicDecrElCntData*) vptr;
- LH_TRACE((" undo --elemcnt\n"));
- if (actionDone) {
- if (LH_IncrElCnt(transRec->tid, rp->rootPid, UserBufGroup,
- rp->key, rp->keyLen, rp->maxKeyLen,
- SMCOMPFUNC[rp->keyType])){
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- LH_LogLogicIncrElCnt(indp->SelfID(), pHash, *lrc,
- rp->rootPid,
- rp->key, rp->keyLen, rp->maxKeyLen,
- rp->keyType);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
- case LOG_ACTION_LHASH_LOGIC_SET_OVERFLOW:
- {
- LogLhashLogicSetOverflowData* rp =
- (LogLhashLogicSetOverflowData*) vptr;
- LH_TRACE(("undo set overflow\n"));
- if (actionDone) {
- if (LH_ResetOverflow(transRec->tid, rp->rootPid, UserBufGroup,
- rp->KeyValue(), rp->keyLen,
- rp->maxKeyLen, SMCOMPFUNC[rp->keyType],
- rp->ElList(), rp->numEl)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- LH_LogLogicResetOverflow(indp->SelfID(), pHash,
- *lrc, rp->rootPid,
- rp->KeyValue(), rp->keyLen,
- rp->maxKeyLen, rp->keyType,
- rp->numEl, rp->elSize,
- rp->ElList(), rp->ovPid);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
- case LOG_ACTION_LHASH_LOGIC_RESET_OVERFLOW:
- {
- LogLhashLogicResetOverflowData* rp =
- (LogLhashLogicResetOverflowData*) vptr;
- LH_TRACE(("undo reset overflow\n"));
- if (actionDone) {
- if (LH_SetOverflow(transRec->tid, rp->rootPid, UserBufGroup,
- rp->KeyValue(), rp->keyLen,
- rp->maxKeyLen, SMCOMPFUNC[rp->keyType],
- rp->ElList(), rp->elSize, rp->numEl)) {
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
- }
- else {
- LH_LogLogicSetOverflow(indp->SelfID(), pHash, *lrc,
- rp->rootPid, rp->KeyValue(),
- rp->keyLen, rp->maxKeyLen, rp->keyType,
- rp->numEl, rp->elSize, rp->ElList(),
- rp->ovPid);
- }
- }
- actionDone = FALSE; /* assume action not done on this page */
- break;
- case LOG_ACTION_LHASH_OV_CONVERT:
- {
- LogLhashOvConvertData* rp =
- (LogLhashOvConvertData*) vptr;
- LH_TRACE(("undo convert overflow\n"));
- if (actionDone) {
- indp->OvConvert(rp->oldHashVal, FALSE);
- }
- LH_LogOvConvert(indp->SelfID(), pHash, *lrc, rp->newHashVal,
- rp->oldHashVal, FALSE);
- }
- break;
- default:
- SM_ERROR(TYPE_FATAL, esmINTERNAL);
- }
-
- LH_LogPureCLR(undoNextLSN);
- LH_TRACE(("CLR %d\n", undoNextLSN));
- bf_UnfixPage(groupLink, BF_DEFAULT, actionDone);
- }
-
-
-